/*
 * @Description: 
 * @Author: your name
 * @version: 
 * @Date: 2024-10-22 10:33:35
 * @LastEditors: your name
 * @LastEditTime: 2024-10-22 10:48:04
 */
import * as Cesium from 'cesium'

/**
 * 笛卡尔3转经纬度
 * @param {Cesium.Viewer} viewer : viewer程序对象
 * @param {Cesium.Cartesian3} cartesianPosition : 笛卡尔三维坐标
 */
export const cartesian3ToLng=(viewer,cartesianPosition)=>{
    // 获取当前地球的椭球体:包含了当前椭球的大小，坐标系系统，坐标系转换工具
    const ellipsoid=viewer.scene.globe.ellipsoid
    // 得到一个弧度制的经纬度数据
    const cartographic=ellipsoid.cartesianToCartographic(cartesianPosition)
    const lat=Cesium.Math.toDegrees(cartographic.latitude)
    const lng=Cesium.Math.toDegrees(cartographic.longitude)
    const height=cartographic.height
    return {
        lng,lat,height
    }
}

/**
 * 经纬度转笛卡尔3
 * @param {Object} 经纬度坐标
 */
export const lngToCartesian3=(positionLng)=>{
    const {lng,lat,height}=positionLng
    return new Cesium.Cartesian3.fromDegrees(lng,lat,height)
}

/**
 * 经纬度转笛卡尔3(批量转换)
 * @param {Array<{lng,lat,height}|{lng,lat}>} 经纬度坐标数组
 */
export const cartographicsToCartesian3=(positionArr)=>{
    const targetArr=[]
    let isHeight=false
    positionArr.forEach(item=>{
        const {lng,lat,height}=item
        if(height || height===0){
            isHeight=true
            targetArr.push(lng,lat,height)
        }else{
            isHeight=false
            targetArr.push(lng,lat)
        }
    })
    // 根据是否带高，来选择不同的api
    return isHeight?
    new Cesium.Cartesian3.fromDegreesArrayHeights(targetArr):
    new Cesium.Cartesian3.fromDegreesArray(targetArr)
}

/**
 * 屏幕坐标转世界坐标
 * @param {Cesium.Viewer} viewer : viewer程序对象
 * @param {Cesium.Cartesian2} screenPos 屏幕坐标
 */
export const screenPosToCartesian3=(viewer,screenPos)=>{
    return viewer.scene.globe.pick(
        viewer.camera.getPickRay(screenPos),
        viewer.scene
    )
}

/**
 * 世界坐标转屏幕坐标
 * @param {Cesium.Viewer} viewer : viewer程序对象
 * @param {Cesium.Cartesian3} cartesian3 世界坐标
 */
 export const cartesian3ToScreen=(viewer,cartesian3)=>{
    return Cesium.SceneTransforms.wgs84ToWindowCoordinates(
        viewer.scene,
        cartesian3
    )
}